package br.com.gbvbahia.mybooks.modelos;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.commons.lang3.StringUtils;

import br.com.gbvbahia.commons.modelos.EntityInterface;
import br.com.gbvbahia.mybooks.R;
import br.com.gbvbahia.mybooks.constantes.StatusLivro;
import br.com.gbvbahia.mybooks.constantes.TipoLivro;
import br.com.gbvbahia.mybooks.dao.contract.DB;

public class LivroVO implements EntityInterface{
	
	public static final String TAG = "livro_vo_key";
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	/**
	 * Validacao:
	 * TAM:100
	 */
	private String id;
	/**
	 * Validacao:
	 * TAM:100
	 */
	private String nomeLivro;
	/**
	 * Validacao:
	 * TAM:100
	 */
	private String autorLivro;
	/**
	 * Validacao:
	 * TAM:20
	 */
	private String isbnLivro;
	/**
	 * Validacao:
	 * TAM:500
	 */
	private String descricao;
	/**
	 * Validacao:
	 * MIN:0
	 */
	private int ano;
	/**
	 * Validacao:
	 * MIN: 1
	 */
	private int edicaoLivro = 1;
	/**
	 * Validacao:
	 * TAM:20
	 */
	private TipoLivro tipo;
	/**
	 * Validacao:
	 * TAM:20
	 */
	private StatusLivro status;
	/**
	 * Validacao:
	 * TAM:100
	 */
	private String cdEditora;
	/**
	 * Validacao:
	 * Entre 0-1
	 */
	private int sincronizado = DB.NOT_SINCRONIZADO;
	/**
	 * Validacao:
	 * TAM:30
	 */
	private long dataAlteracao = new Date().getTime();
	//Avaliacao
	/**
	 * Validacao:
	 * TAM:Entre 0-1
	 */
	private int recomendado = EntityInterface.FALSE;
	/**
	 * Min -1
	 */
	private int nota = -1;
	/**
	 * Validacao:
	 * TAM:1000
	 */
	private String avaliacao;
	/**
	 * Validacao:
	 * TAM:1000
	 */
	private String preAvaliacao;
	
	@Override
	public void prepareUpdate() {
		dataAlteracao = new Date().getTime();
		sincronizado = DB.NOT_SINCRONIZADO;
	}

	
	
	@Override
	public List<Integer> seValidar() {
		List<Integer> toReturn = new ArrayList<Integer>();
		if(nomeLivro == null){
			toReturn.add(R.string.aviso_3);
		}else if(nomeLivro.length() > 100){
			toReturn.add(R.string.aviso_54);
		}
		if(StringUtils.length(autorLivro) > 100){
			toReturn.add(R.string.aviso_55);
		}
		if(edicaoLivro <= 0){
			toReturn.add(R.string.aviso_56);
		}
		if(StringUtils.length(isbnLivro) > 20){
			toReturn.add(R.string.aviso_57);
		}
		if(StringUtils.length(descricao) > 500){
			toReturn.add(R.string.aviso_58);
		}
		if(ano < 0){
			toReturn.add(R.string.aviso_59);
		}
		if(nota < -1 || nota > 10){
			toReturn.add(R.string.aviso_60);
		}
		if(StringUtils.length(avaliacao) > 1000){
			toReturn.add(R.string.aviso_61);
		}
		if(StringUtils.length(preAvaliacao) > 1000){
			toReturn.add(R.string.aviso_62);
		}
		return toReturn;
	}



	@Override
	public void prepareInsert() {
		prepareUpdate();		
	}
	
	public LivroVO(String nomeLivro, String autorLivro, int edicaoLivro,
			String descricao, int ano, String status, int nota, String tipo,
			int sincronizado, String cdEditora, String isbnLivro, 
			String avaliacao, int recomendado, String preAvaliacao) {
		super();
		this.nomeLivro = nomeLivro;
		this.autorLivro = autorLivro;
		this.edicaoLivro = edicaoLivro;
		this.descricao = descricao;
		this.ano = ano;
		this.status = StatusLivro.getStatus(status);
		this.nota = nota;
		this.tipo = TipoLivro.getTipo(tipo);
		this.sincronizado = sincronizado;
		this.cdEditora = cdEditora;
		this.isbnLivro = isbnLivro;
		this.avaliacao = avaliacao;
		this.recomendado = recomendado;
		this.preAvaliacao = preAvaliacao;
	}

	public LivroVO() {
		super();
	}

	public String getNomeLivro() {
		return nomeLivro;
	}

	public void setNomeLivro(String nomeLivro) {
		this.nomeLivro = nomeLivro;
	}

	public String getAutorLivro() {
		return autorLivro;
	}

	public void setAutorLivro(String autorLivro) {
		this.autorLivro = autorLivro;
	}

	public int getEdicaoLivro() {
		return edicaoLivro;
	}

	public void setEdicaoLivro(int edicaoLivro) {
		this.edicaoLivro = edicaoLivro;
	}

	@Override
	public String getId() {
		return id;
	}

	@Override
	public boolean gerarId() {
		return StringUtils.isBlank(id);
	}

	@Override
	public void setId(Serializable id) {
		setId(id.toString());
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getIsbnLivro() {
		return isbnLivro;
	}

	public void setIsbnLivro(String isbnLivro) {
		this.isbnLivro = isbnLivro;
	}

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public int getAno() {
		return ano;
	}

	public void setAno(int ano) {
		this.ano = ano;
	}

	public String getStatusString() {
		return StatusLivro.getStringStatus(this.status);
	}

	public void setStatusString(String status) {
		this.status = StatusLivro.getStatus(status);
	}

	public StatusLivro getStatus() {
		return status;
	}

	public void setStatus(StatusLivro status) {
		this.status = status;
	}

	public int getNota() {
		return nota;
	}

	public void setNota(int nota) {
		this.nota = nota;
	}

	public String getTipoString() {
		return TipoLivro.getStringTipo(tipo);
	}

	public void setTipoString(String tipo) {
		this.tipo = TipoLivro.getTipo(tipo);
	}

	public TipoLivro getTipo() {
		return tipo;
	}

	public void setTipo(TipoLivro tipo) {
		this.tipo = tipo;
	}

	public int getSincronizado() {
		return sincronizado;
	}

	public void setSincronizado(int sincronizado) {
		this.sincronizado = sincronizado;
	}

	public String getCdEditora() {
		return cdEditora;
	}

	public void setCdEditora(String cdEditora) {
		this.cdEditora = cdEditora;
	}

	public long getDataAlteracao() {
		return dataAlteracao;
	}

	public void setDataAlteracao(long dataAlteracao) {
		this.dataAlteracao = dataAlteracao;
	}

	public String getAvaliacao() {
		return avaliacao;
	}

	public void setAvaliacao(String avaliacao) {
		this.avaliacao = avaliacao;
	}

	public int getRecomendado() {
		return recomendado;
	}

	public void setRecomendado(int recomendado) {
		this.recomendado = recomendado;
	}

	public String getPreAvaliacao() {
		return preAvaliacao;
	}

	public void setPreAvaliacao(String preAvaliacao) {
		this.preAvaliacao = preAvaliacao;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		LivroVO other = (LivroVO) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}
	public void setDateAlteracao(Date date) {
		this.dataAlteracao = date.getTime();
	}

	public Date getDateAlteracao() {
		return new Date(dataAlteracao);
	}
}
